gdkdnd: Stick to the first gdk_drag_drop_done() result
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 15 Feb 2016 17:56:42 +0000 (18:56 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Mon, 15 Feb 2016 18:04:22 +0000 (19:04 +0100)
That way we can let ::cancel callers to override the visual
result of the operation (eg. when detaching notebook tabs on
NO_TARGET).

Also, document gdk_drag_drop_done() so it is mentioned that
this is a one-shot call.

https://bugzilla.gnome.org/show_bug.cgi?id=761954

gdk/gdkdnd.c
gdk/gdkdndprivate.h

index b76b1108041d50f9fc349dcb1490b155072f7993..02d8d53420a797ac619477852deef914873ee53f 100644 (file)
@@ -641,6 +641,10 @@ gdk_drag_context_set_hotspot (GdkDragContext *context,
  * be the last call before dropping the reference to the
  * @context.
  *
+ * The #GdkDragContext will only take the first gdk_drag_drop_done()
+ * call as effective, if this function is called multiple times,
+ * all subsequent calls will be ignored.
+ *
  * Since: 3.20
  */
 void
@@ -649,6 +653,11 @@ gdk_drag_drop_done (GdkDragContext *context,
 {
   g_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
 
+  if (context->drop_done)
+    return;
+
+  context->drop_done = TRUE;
+
   if (GDK_DRAG_CONTEXT_GET_CLASS (context)->drop_done)
     GDK_DRAG_CONTEXT_GET_CLASS (context)->drop_done (context, success);
 }
index 8eb94b8fa07a62b33b47a67c528d05f4b9ce2387..c66de32d850b2fc0c774398ab5bc5bd582054486 100644 (file)
@@ -105,6 +105,8 @@ struct _GdkDragContext {
   guint32 start_time;
 
   GdkDevice *device;
+
+  guint drop_done : 1; /* Whether gdk_drag_drop_done() was performed */
 };
 
 GList *  gdk_drag_context_list (void);